webpack - 生产环境配置

这里主要说一下当一个文件要被多个loader处理的情况,因为本章其实是之前的总结。

关于正常来说一个文件,只能被一个loader进行处理;

当一个文件要被多个loader进行处理,那么一定要指定loader的执行顺序。

比如:js文件之前需要经过,eslint-loaderbabel-loader。那么就需要分配好执行顺序。

先执行eslint,在执行babel

故:可以通过属性enforce'pre'来表示优先执行;

// 添加eslint
{
  // 只检查js文件
  test: /.js$/,
  loader: 'eslint-loader',
  // 表示优先执行
  enforce: 'pre',
  // 只需要检查自己写的代码,不需要检查node_modules
  exclude: /node_modules/,
  options: {
    fix: true,
  }
},

整合到webpack.prod.config.js文件

// 正式环境配置
const HtmlWebpackPlugin = require('html-webpack-plugin')
const {
  CleanWebpackPlugin
} = require('clean-webpack-plugin')
const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
// 单独压缩css文件
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')

// postcss loader 配置提取
const postcssLoaderConfig = {
  loader: 'postcss-loader',
  options: {
    ident: 'postcss',
    plugins: () => [
      require('postcss-preset-env')()
    ]
  }
}

// 创建css文件loader
const miniCssExtractPluginLoaderConfig = {
  loader: MiniCssExtractPlugin.loader,
  options: {
    // publicPath 这里要特别注意,在插件中 我自定义了目录地址为:css/bundle.css
    // 所以需要设置 publicPath
    // 如果没有设置目录,可以不使用publicPath
    publicPath: '../'
  }
}

// 设置node的当前的环境变量值为 开发环境
// process.env.NODE_ENV = "development";

module.exports = {
  // 入口起点
  entry: './src/js/index.js',
  // 输入
  output: {
    filename: 'js/bundle.js',
    path: __dirname + '/dist'
  },
  // 模式
  mode: 'production',
  module: {
    // rules 里面就是存放loader的地方
    rules: [{
        test: /.css$/,
        use: [
          // "style-loader",
          // js文件中的css,单独创建成css文件
          miniCssExtractPluginLoaderConfig,
          "css-loader",
          postcssLoaderConfig,
        ]
      },
      {
        test: /.less$/,
        use: [
          // "style-loader",
          // js文件中的css,单独创建成css文件
          miniCssExtractPluginLoaderConfig,
          "css-loader",
          postcssLoaderConfig,
          "less-loader"
        ]
      },
      {
        // 处理相关图片资源
        test: /.(jpg|png|gif)$/,
        // 如果只用到一个loader,可以直接这样写
        loader: 'url-loader',
        options: {
          // 图片大小于8Kb,会被转成base64  12Kb以下都是适合的,更大的话就不建议
          limit: 8 * 1024,
          // 关闭url-loader的es6模块
          esModule: false,
          // 给图片重命名,
          name: '[hash:10].[name].[ext]',
          // 输出文件目录
          outputPath: 'imgs'
        }
      },
      {
        test: /\.html$/,
        loader: 'html-loader',
      },
      {
        // exclude:排除 css,js,html, json, less文件等
        exclude: /\.(css|js|html|json|less|jpg|png|gif)$/,
        loader: 'file-loader',
        options: {
          name: '[hash:10].[ext]',
          // 输出文件目录
          outputPath: 'media'
        }
      },
      // 添加eslint
      {
        // 只检查js文件
        test: /.js$/,
        loader: 'eslint-loader',
        // 表示优先执行
        enforce: 'pre',
        // 只需要检查自己写的代码,不需要检查node_modules
        exclude: /node_modules/,
        options: {
          fix: true,
        }
      },
      // 添加js兼容性
      {
        test: /.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: {
          // 预设babel要做哪种兼容,目前使用的是 @babel/preset-env
          presets: [
            [
              '@babel/preset-env',
              // 按需加载兼容性
              {
                // 按需加载
                useBuiltIns: 'usage',
                // 指定core-js版本
                corejs: {
                  version: 3
                },
                // 兼容哪些浏览器
                targets: {
                  ie: '9',
                  chrome: '50',
                  // ...
                }
              }
            ]
          ]
        }
      },
    ]
  },
  // 插件
  plugins: [
    new HtmlWebpackPlugin({
      template: `./src/index.html`,
      minify: {
        // 移除空格
        collapseWhitespace: true,
        // 移除注释
        removeComments: true,
      }
    }),
    new CleanWebpackPlugin(),
    // js文件中的css,单独创建成css文件,所以loader就不能使用 style-loader
    new MiniCssExtractPlugin({
      // 修改目录或者修改文件名
      filename: 'css/bundle.css'
    }),
    // 普通压缩
    // new OptimizeCssAssetsWebpackPlugin(),
    // 使用cssnano配置规则压缩,同时需要在package.json中配置browserslist
    new OptimizeCssAssetsWebpackPlugin({
      cssProcessor: require('cssnano'), //引入cssnano配置压缩选项
      cssProcessorOptions: {
        discardComments: {
          removeAll: true
        }
      },
      canPrint: true //是否将插件信息打印到控制台
    })
  ],
}

其中package.json中的相关配置

  "browserslist": {
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ],
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ]
  },
  "eslintConfig": {
    "extends": "airbnb-base",
    "rules": {
      "linebreak-style": [
        "off",
        "windows"
      ]
    }
  }

本章结束!

results matching ""

    No results matching ""